package com.easyCms.base.utils.time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class DateUtils {
	private static Log logger = LogFactory.getLog(DateUtils.class);

	// 格式化 时间到天
	private static SimpleDateFormat formatDay = new SimpleDateFormat("yyyy-MM-dd");
	// 格式化 时间到月
	private static SimpleDateFormat formatMonth = new SimpleDateFormat("yyyy-MM");
	// 格式化 时间到月
	private static SimpleDateFormat formatMonthStr = new SimpleDateFormat("yyyy年MM月");
	// 格式化 时间到年
	private static SimpleDateFormat formatYear = new SimpleDateFormat("yyyy");
	// 格式化 时间到秒
	private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	// 格式化 时间 （只取 小时分钟秒）
	private static SimpleDateFormat formats = new SimpleDateFormat("HH:mm:ss");
	// 格式化 时间到周 例如"2016-11-25"=>周五
	private static SimpleDateFormat formatWeek = new SimpleDateFormat("EEEE");
	// 格式化时间时分秒
	private static SimpleDateFormat formatHMS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	// 格式化时间20170707101212
	private static SimpleDateFormat formatEven = new SimpleDateFormat("yyyyMMddHHmmss");
	// 格式化 时间到天
	private static SimpleDateFormat dd = new SimpleDateFormat("dd");
	// 格式化 时间 （只取 小时分钟秒）
	private static SimpleDateFormat formatHHmm = new SimpleDateFormat("HH:mm");
	// 格式化到月（11）
	private static SimpleDateFormat formatMM = new SimpleDateFormat("MM");

	// 获取传入日期‘2017-01-01 15:12:12’得到20170101151212
	public static String getEvenTime(Date date) {
		return formatEven.format(date);
	}

	// 获取传入日期的后一天 例如今天是 "2016-12-29 16:38:00"=>"2016-12-30 16:38:00"
	public static Date getNextDayTime(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, 1);
		date = calendar.getTime();
		return date;
	}

	// 获取传入日期上个月的年月：2017-06=>2017-05
	public static String getLastMonthStr(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MONTH, -1);
		return formatMonth.format(cal.getTime());
	}

	// 获取传入日期的当月第一天(------>2017-09-01)
	public static String getCurrentMonthFristDay(Date date) {
		String dateStr = formatMonth.format(date);
		return dateStr + "-01";
	}

	// 获取传入日期的上个月的第一天(2017-09-05 ------>2017-08-01)
	public static String getPreMonthFristDay(Date date) {
		String lastMonthStr = getLastMonthStr(date);
		return lastMonthStr + "-01";
	}

	// 获取传入日期的前x天 例如今天是 "2016-12-29"=>"2016-12-28"
	public static String getPreviousDayTime(String dateStr, int x) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		Date parse = formatDay.parse(dateStr);
		calendar.setTime(parse);
		calendar.add(Calendar.DAY_OF_MONTH, Integer.parseInt("-" + x));
		return formatDay.format(calendar.getTime());
	}

	// 获取传入日期去年同月：2017-06->2016-06
	public static String getLastYearMonthStr(String dateStr) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		Date parse = formatMonth.parse(dateStr);
		calendar.setTime(parse);
		calendar.add(Calendar.YEAR, -1);
		return formatMonth.format(calendar.getTime());
	}

	// 2017-06->2016年06月
	public static String formatMonthChineseStr(String dateStr) throws ParseException {
		Date parse = formatMonth.parse(dateStr);
		return formatMonthStr.format(parse);
	}

	// 获取传入日期的上个月
	public static String getLastMonthStr(String dateStr) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		Date parse = formatMonth.parse(dateStr);
		calendar.setTime(parse);
		calendar.add(Calendar.MONTH, -1);
		return formatMonth.format(calendar.getTime());
	}

	// 获取传入日期的上个月
	public static String getLastMonthStrByDate(Date date) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, -1);
		return formatMonth.format(calendar.getTime());
	}

	// 获取前一天凌晨的时间例如new date()[2016-12-29 19:00:14]=>"2016-12-28 00:00:00"
	public static Date getPreviousFristDate(Date param) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(param);
		calendar.add(Calendar.DAY_OF_MONTH, -1);
		String preDay = formatDay.format(calendar.getTime()) + " 00:00:00";
		return format.parse(preDay);
	}

	// 获取当天凌晨的时间例如new date()[2016-12-29 19:00:14]=>"2016-12-29 00:00:00"
	public static Date currentFristDate(Date param) throws ParseException {
		String fristStr = formatDay.format(param) + " 00:00:00";
		return format.parse(fristStr);
	}

	// 获取传入日期的后一天 例如今天是 "2016-12-29 16:38:00"=>"2016-12-30"
	public static Date getNextDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, 1);
		return StringToDateDay(format.format(calendar.getTime()));
	}

	// 获取传入参数日期的 前两个小时的时间（）
	public static Date getTwoHoursBeforeTime(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MINUTE, -120);
		return StringToDate(format.format(cal.getTime()));
	}

	// 获取传入参数日期的 半小时后的时间(ok)
	public static Date getHalfHourLateTime(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MINUTE, 30);
		return StringToDate(format.format(cal.getTime()));
	}

	// 获取昨天时间 例如：2016-11-28(ok)
	public static String getYesterday(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, -1);
		return formatDay.format(cal.getTime());
	}

	// 获取昨天时间 默认为当天的昨天
	public static String getYesterday() {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, -1);
		return formatDay.format(cal.getTime());
	}

	// 返回当天时间 例如：2016-11-29(ok)
	public static String getToday() {
		Calendar cal = Calendar.getInstance();
		return formatDay.format(cal.getTime());
	}

	// 判断当天是否为本月第一天 是true 否false
	public static Boolean isMonthFirstDay() {
		Calendar c = Calendar.getInstance();
		// c.setTime(date);//传入的时间
		int today = c.get(c.DAY_OF_MONTH);
		if (1 == today) {
			return Boolean.TRUE;
		}
		return Boolean.FALSE;
	}

	// 格式化时间 String => Date(ok)
	public static Date StringToDate(String param) {
		Date resultDate = new Date();
		try {
			resultDate = format.parse(param);
		} catch (ParseException e) {
			logger.error("时间转换异常：", e);
		}
		return resultDate;
	}

	// 格式化时间 String => Date(ok) 日期格式 "2016-11-25"
	public static Date StringToDateDay(String param) {
		Date resultDate = new Date();
		try {
			resultDate = formatDay.parse(param);
		} catch (ParseException e) {
			logger.error("时间转换异常：", e);
		}
		return resultDate;
	}

	// 格式化 时间 例如 "2016-11-25 10:39:25" => "星期五"(ok)
	public static String formatWeek(Date param) {
		return formatWeek.format(param);
	}

	// 格式化 时间 例如 "10:39:25"
	public static Date formatHMS(String param) {
		Date resultDate = new Date();
		try {
			resultDate = formatHMS.parse(param);
		} catch (ParseException e) {
			logger.error("时间转换异常：", e);
		}
		return resultDate;
	}

	// 格式化 时间 例如 "10:39:25"
	public static Date formatHMS(Date param) {
		String time = formatHMS.format(param);
		Date times = new Date();
		try {
			times = formatHMS.parse(time);
		} catch (ParseException e) {
			logger.error("时间转换异常：", e);
		}
		return times;
	}

	// 格式化 时间 例如 "2016-11-25 10:39:25" =>"2016-11-25" (ok)
	public static String formatDay(Date param) {
		return formatDay.format(param);
	}

	public static String formatYear(Date param) {
		return formatYear.format(param);
	}

	// 2017-11-20 11:24:00 -> 20
	public static String formatDd(Date param) {
		return dd.format(param);
	}

	// 2017-11-20 11:24:00 -> 11:24
	public static String formatHHmm(Date param) {
		return formatHHmm.format(param);
	}

	// 2017-11-20 12:24:00 -> 11
	public static String formatMM(Date param) {
		return formatMM.format(param);
	}

	/**
	 * 去年的日期 ： 2017-》2016
	 * 
	 * @param param
	 * @return
	 * @throws ParseException
	 */
	public static String lastYearStr(Date param) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(param);
		calendar.add(Calendar.YEAR, -1);
		return formatYear.format(calendar.getTime());
	}

	// 获取当前时间的年月 例如"2016-11-25 10:39:25" =>"2016-11" (ok)
	public static String formatMonth(Date param) {
		return formatMonth.format(param);
	}

	// 获取传入日期的 小时分钟秒 例如date="2016-12-14 10:30:25" =>"10:30:25"
	public static String getHourMinuteSecond(Date date) {
		return formats.format(date);
	}

	// 获取当前时间的年月 例如"2016-11-25 10:39:25" =>"2016-11-25 10:39:25" (ok)
	public static String format(Date param) {
		return format.format(param);
	}

	// 截取时间字符串 例如"2016-11-25 10:39:25.0" =>"2016-11-25 10:39:25" (ok)
	public static String cutDate(String date) {
		return date.substring(0, date.length() - 2);
	}

	/**
	 * 时间格式转换 "20120124160830" => "2012-01-24 16:08:30"
	 * 
	 * @param str
	 * @return
	 */
	public static String changeToDateStr(String str) {
		if (StringUtils.isBlank(str) || str.length() < 14) {
			return null;
		}
		StringBuilder sb = new StringBuilder(str);
		sb.insert(4, "-");
		sb.insert(7, "-");
		sb.insert(10, " ");
		sb.insert(13, ":");
		sb.insert(16, ":");
		return sb.toString();
	}

	/**
	 * 获取下一时间(某段分钟之后的时间)
	 */
	public static String getNextDateStr(Date param, int min) {
		long curren = param.getTime();
		curren += min * 60 * 1000;
		Date da = new Date(curren);
		return format.format(da);
	}

	/**
	 * 获取上一时间(某段分钟之后的时间)
	 */
	public static String getPrevDateStr(Date param, int min) {
		long curren = param.getTime();
		curren -= min * 60 * 1000;
		Date da = new Date(curren);
		return format.format(da);
	}

}
